home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / source / src / arith / ivec.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-16  |  5.9 KB  |  259 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  ivec.c
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. /*              ivec.c           RD, 18.12.89 */
  16.  
  17. /*    RD, 11.9.91, vecsri hinzugefuegt    */
  18. /*    RD, 27.9.91, veceq, vecgt, vecsr1, vecsri jetzt in iplace.c */
  19.  
  20. #include <LEDA/impl/iint.h>
  21. #include <LEDA/impl/iloc.h>
  22.  
  23. #ifdef USE_DOUBLEPLACE
  24.  
  25. #ifndef ATARI
  26. #ifndef __PARC__
  27. int cvadd(sum, a, b, counta, countb)
  28.         register pPLACE sum, a, b; 
  29.         register int counta, countb;
  30.         /* sum[]=a[counta]+b[countb]; 
  31.        sum soll auch Uebertraege fassen */
  32. {       register DOUBLEPLACE accu = 0;
  33.     register int countmax;
  34.     if (counta>countb) {
  35.         countmax=counta;
  36.         counta-=countb;
  37.             for ( ; countb>0; countb--) {
  38.                     accu+=*a++;
  39.                     accu+=*b++;
  40.                     *sum++=accu;
  41.                     accu >>= LOGRADIX;
  42.             }
  43.             for ( ; counta>0; counta--) {
  44.                     accu+=*a++;
  45.                     *sum++=accu;
  46.                     accu >>= LOGRADIX;
  47.             }
  48.     } else {
  49.         countmax=countb;
  50.         countb-=counta;
  51.             for ( ; counta>0; counta--) {
  52.                     accu+=*a++;
  53.                     accu+=*b++;
  54.                     *sum++=accu;
  55.                     accu >>= LOGRADIX;
  56.             }
  57.             for ( ; countb>0; countb--) {
  58.                     accu+=*b++;
  59.                     *sum++=accu;
  60.                     accu >>= LOGRADIX;
  61.         }    }
  62.     *sum=accu;
  63.     if (accu)
  64.         return countmax+1;
  65.     else
  66.         return countmax;
  67. }    /* cvadd */
  68. #endif
  69. #endif
  70.  
  71. #ifndef ATARI
  72. #ifndef __PARC__
  73. void cvecsubto(a, b, count)
  74.         register PLACE *a, *b; 
  75.         register int count;
  76.         /* a[]-=b[count]; a muss groesser oder gleich b sein */
  77. {       register SDOUBLEPLACE accu = 0;
  78.         for ( ; count>0; count--) {
  79.                 accu+=*a;
  80.                 accu-=*b++;
  81.                 *a++=accu;
  82.                 accu >>= LOGRADIX;
  83.         }
  84.         while (accu) {
  85.                 accu+=*a;
  86.                 *a++=accu;
  87.                 accu >>= LOGRADIX;
  88.         }
  89. }        /* cvecsubto */
  90. #endif
  91. #endif
  92.  
  93. #ifndef __PARC__
  94. #ifndef ATARI
  95. int cvsub(diff, a, b, counta, countb)
  96.     register pPLACE diff, a, b;
  97.     register int counta, countb;
  98.     /* diff[]=a[counta]-b[countb]; a>=b */
  99. {       register SDOUBLEPLACE accu = 0;
  100.     register int l=counta;
  101.     counta-=countb;
  102.     for ( ; countb>0; countb--) {
  103.         accu+=*a++;
  104.         accu-=*b++;
  105.         *diff++=accu;
  106.         accu>>=LOGRADIX;
  107.     }
  108.     while (accu) {
  109.         accu+=*a++;
  110.         *diff++=accu;
  111.         accu >>= LOGRADIX;
  112.         counta--;
  113.     }
  114.     for ( ; counta>0; counta--) {
  115.         *diff++=*a++;
  116.     }
  117.     diff--;
  118.     while ((l>0)&&(! *diff)) {
  119.         diff--;
  120.         l--;
  121.     }
  122.     return l;
  123. }        /* cvsub */
  124. #endif
  125. #endif
  126.  
  127. PLACE vecaddto(a, b, count)
  128.         register PLACE *a, *b; 
  129.         register int count;
  130.         /* a[count]+=b[count]; return carry; */
  131. {       register DOUBLEPLACE accu = 0;
  132.         for ( ; count>0; count--) {
  133.                 accu+=*a;
  134.                 accu+=*b++;
  135.                 *a++=accu;
  136.                 accu >>= LOGRADIX;
  137.         }
  138.         return accu;
  139. }
  140.  
  141. PLACE vecsubto(a, b, count)
  142.         register PLACE *a, *b; 
  143.         register int count;
  144.         /* a[count]-=b[count]; return carry; 0 oder 1 */
  145. {       register SDOUBLEPLACE accu = 0;
  146.         for ( ; count>0; count--) {
  147.                 accu+=*a;
  148.                 accu-=*b++;
  149.                 *a++=accu;
  150.                 accu >>= LOGRADIX;
  151.         }
  152.         return (accu & 1);
  153. }
  154.  
  155. #ifndef __PARC__
  156. #ifndef ATARI
  157. #ifdef __GNUC__
  158. PLACE vecdiv(PLACE *q, PLACE *a, PLACE d, int count)
  159. #else
  160. PLACE vecdiv(q, a, d, count)
  161.         register PLACE *q, *a;
  162.     register PLACE d;
  163.         register int count;
  164. #endif
  165.         /* q[count]=a[count]/d; return a[count]%d; */
  166. {       register DOUBLEPLACE accu=0;
  167.         for (q+=count, a+=count; count>0; count--) {
  168.                 accu <<= LOGRADIX;
  169.                 accu+=*--a;
  170.                 *--q=accu/d;
  171.                 accu%=d;
  172.         }
  173.         return accu;
  174. }
  175. #endif
  176. #endif
  177.  
  178. #ifndef __PARC__
  179. #ifndef ATARI
  180. #ifdef __GNUC__
  181. PLACE vecmul(PLACE *product, PLACE *a, PLACE m, int count)
  182. #else
  183. PLACE vecmul(product, a, m, count)
  184.         register PLACE *product, *a, m;
  185.         register int count;
  186. #endif
  187.         /* product[count]=m*a[count]; return carry; */
  188. {       register DOUBLEPLACE accu=0;
  189.     register DOUBLEPLACE prod;
  190.         for ( ; count>0; count--) {
  191.         prod=*a++;
  192.         prod*=m;
  193.                 accu+=prod;
  194.                 *product++ = accu;
  195.                 accu >>= LOGRADIX;
  196.         }
  197.         return accu;
  198. }        /* vecmul */
  199. #endif
  200. #endif
  201.  
  202. #ifndef ATARI
  203. #ifndef __PARC__
  204. #ifdef __GNUC__
  205. PLACE vecmuladd(PLACE *paccu, PLACE *a, PLACE m, int count)
  206. #else
  207. PLACE vecmuladd(paccu, a, m, count)
  208.         register PLACE *paccu, *a, m; 
  209.         register int count;
  210. #endif
  211.         /* paccu[count] += m*a[count]; return carry; */
  212. {       register DOUBLEPLACE accu=0;
  213.     register DOUBLEPLACE prod;
  214.         for ( ; count>0; count--) {
  215.                 accu+=*paccu;
  216.         prod=*a++;
  217.         prod*=m;
  218.                 accu+=prod;
  219.                 *paccu++ = accu;
  220.                 accu >>= LOGRADIX;
  221.         }
  222.         return accu;
  223. }        /* vecmuladd */
  224. #endif
  225. #endif
  226.  
  227. #ifndef __PARC__
  228. #ifndef ATARI
  229. #ifdef __GNUC__
  230. PLACE vecmulsub(PLACE *paccu, PLACE *a, PLACE m, int count)
  231. #else
  232. PLACE vecmulsub(paccu, a, m, count)
  233.         register PLACE *paccu, *a, m;
  234.         register int count;
  235. #endif
  236.         /* paccu[count+1] -= m*a[count]; return carry; 
  237.         carry ist 0 oder 1 */
  238. {       register DOUBLEPLACE accu;
  239.         register SDOUBLEPLACE saccu=0;
  240.         for ( ; count>0; count--) {
  241.                 accu =*a++;
  242.         accu*=m;
  243.                 saccu=saccu + *paccu - (PLACE)accu;
  244.                 *paccu++ = saccu;
  245.                 saccu >>= LOGRADIX;
  246.                 accu>>=LOGRADIX;
  247.                 saccu-=accu;
  248.         }
  249.         saccu += *paccu;
  250.         *paccu = saccu;
  251.         saccu >>= LOGRADIX;
  252.         return (saccu & 1);
  253. }
  254. #endif
  255. #endif
  256.  
  257. #endif
  258.